package cl.mt.mvc.action.transportista;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cl.mt.dto.DTOOfertaCarga;
import cl.mt.dto.DTOPostulacion;
import cl.mt.dto.DTOUsuario;
import cl.mt.dto.DTOVehiculo;
import cl.mt.mvc.action.transportista.helper.FiltroTransportistaDTO;
import cl.mt.mvc.action.transportista.helper.TransportistaHelper;
import cl.mt.mvc.helper.UsuarioHelper;
import cl.mt.util.Utiles;

public class Postulaciones extends Action {
	private Logger log = LogManager.getLogger(Postulaciones.class.getName());
	private static String FORMATO_FECHA = "dd-MM-yyyy";

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

		String accion = request.getParameter("accion");
		log.debug("Accion Publicaciones [" + accion + "]");

		// Buscamos los datos del Usuario Conectado.
		UsuarioHelper userHelper = new UsuarioHelper();
		DTOUsuario userDto = userHelper.getUserConectado(request);
		if (userDto == null) {
			log.error("Usuario No se encuentra Logeado");
			return mapping.findForward("ERROR");
		}

		if (accion == null || "listado".equals(accion))
			return listado(mapping, userDto, request);

		if ("ver".equals(accion))
			return view(mapping, userDto, request);
		if ("listaOfertas".equals(accion))
			return listadoOfertas(mapping, userDto, request);
		if ("editar".equals(accion))
			return edit(mapping, userDto, request);
		if ("borrar".equals(accion))
			return view(mapping, userDto, request);
		if ("eliminar".equals(accion))
			return delete(mapping, userDto, request);
		if ("crear".equals(accion))
			return create(mapping, userDto, request);

		return listado(mapping, userDto, request);

	}

	public ActionForward listado(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "LISTADO";

		TransportistaHelper transHelper = new TransportistaHelper();
		FiltroTransportistaDTO filtroDto = getDatosFiltro(request);
		filtroDto.setIdUsuario(userDto.getId());
		List<DTOPostulacion> listaPostulaciones = transHelper.getListaPostulaciones(filtroDto);

		// Retornamos.
		request.setAttribute("listaPostulaciones", listaPostulaciones);
		return mapping.findForward(forward);

	}

	public ActionForward listadoOfertas(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "LISTADO_OFERTAS";

		TransportistaHelper transHelper = new TransportistaHelper();
		FiltroTransportistaDTO filtroDto = getDatosFiltro(request);
		filtroDto.setIdUsuario(userDto.getId());
		List<DTOOfertaCarga> listaOfertas = transHelper.getListaOfertaCarga(filtroDto);

		// Retornamos.
		request.setAttribute("listaOfertas", listaOfertas);
		return mapping.findForward(forward);

	}

	public ActionForward view(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "VER";

		// Buscamos los datos del Postulacion.

		Integer idPostulacion = Utiles.parseInteger(request.getParameter("idPostulacion"));
		Integer idOfertaCarga = Utiles.parseInteger(request.getParameter("idOfertaCarga"));

		// Buscamos los datos del Postulacion.
		TransportistaHelper transHelper = new TransportistaHelper();
		DTOPostulacion dtoPostulacion = transHelper.getPostulacion(idPostulacion);

		if (dtoPostulacion != null && dtoPostulacion.getIdOfertaCarga() != null) {
			idOfertaCarga = dtoPostulacion.getIdOfertaCarga();
		}

		DTOOfertaCarga dtoOfertaCarga = transHelper.getOfertaCarga(idOfertaCarga);

		// Retornamos.
		if ("borrar".equals(request.getParameter("accion")))
			request.setAttribute("hayQueBorrar", "S");
		request.setAttribute("DatoPostulacion", dtoPostulacion);
		request.setAttribute("DatoOfertaCarga", dtoOfertaCarga);
		return mapping.findForward(forward);

	}

	public ActionForward edit(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "EDITAR";

		Integer idPostulacion = Utiles.parseInteger(request.getParameter("idPostulacion"));
		Integer idOfertaCarga = Utiles.parseInteger(request.getParameter("idOfertaCarga"));

		// Buscamos los datos del Postulacion.
		TransportistaHelper transHelper = new TransportistaHelper();
		DTOPostulacion dtoPostulacion = transHelper.getPostulacion(idPostulacion);

		if (dtoPostulacion != null && dtoPostulacion.getIdOfertaCarga() != null) {
			idOfertaCarga = dtoPostulacion.getIdOfertaCarga();
		}

		DTOOfertaCarga dtoOfertaCarga = transHelper.getOfertaCarga(idOfertaCarga);

		List<DTOVehiculo> listaVehiculos = transHelper.getListaVehiculos(userDto.getId());

		// Retornamos.
		request.setAttribute("listaVehiculos", listaVehiculos);
		request.setAttribute("DatoPostulacion", dtoPostulacion);
		request.setAttribute("DatoOfertaCarga", dtoOfertaCarga);

		return mapping.findForward(forward);

	}

	public ActionForward delete(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "RESULTADO";

		Integer idPostulacion = Utiles.parseInteger(request.getParameter("idPostulacion"));

		// Buscamos los datos del Postulacion.
		TransportistaHelper transHelper = new TransportistaHelper();
		DTOPostulacion dtoPostulacion = transHelper.getPostulacion(idPostulacion);

		request.setAttribute("MsgRespuesta", "Postulacion eliminado Correctamente");
		if (dtoPostulacion == null) {
			log.debug("Postulacion NO existe");
			request.setAttribute("MsgRespuesta", "Postulacion no Existe");
			return mapping.findForward(forward);
		}

		int res = transHelper.deletePostulacion(idPostulacion);
		if (res == 0) {
			log.debug("Error. No se pudo eliminar Postulacion");
			request.setAttribute("MsgRespuesta", "Error. No se pudo Eliminar Postulacion");
		}

		// Retornamos.
		return mapping.findForward(forward);

	}

	public ActionForward create(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "RESULTADO";

		DTOPostulacion dtoPostulacion = getDatosPostulacion(request);
		dtoPostulacion.setIdUsuario(userDto.getId());

		// Buscamos los datos del Postulacion.
		TransportistaHelper transHelper = new TransportistaHelper();

		DTOPostulacion dtoRespuesta = transHelper.createPostulacion(dtoPostulacion);
		if (dtoRespuesta == null) {
			log.debug("Error. No se pudo crear Postulacion");
			request.setAttribute("MsgRespuesta", "Error. No se pudo Crear Postulacion");
		}
		// Retornamos.
		request.setAttribute("DatoPostulacion", dtoRespuesta);
		return mapping.findForward(forward);

	}

	private DTOPostulacion getDatosPostulacion(HttpServletRequest request) {

		DTOPostulacion dto = new DTOPostulacion();

		dto.setIdVehiculo(Utiles.parseInteger(request.getParameter("idVehiculo")));
		dto.setIdOfertaCarga(Utiles.parseInteger(request.getParameter("idOfertaCarga")));
		// dto.setDetalleVehiculo(Utiles.parseInteger(request.getParameter("idTipoPostulacion")));

		dto.setIdTipoUnidad(Utiles.parseInteger(request.getParameter("idTipoUnidad")));
		dto.setIdTipoMoneda(Utiles.parseInteger(request.getParameter("idTipoMoneda")));

		return dto;
	}

	private FiltroTransportistaDTO getDatosFiltro(HttpServletRequest request) {
		FiltroTransportistaDTO filtro = new FiltroTransportistaDTO();
		filtro.setFechaDesde(Utiles.stringToDate(request.getParameter("fechaDesde"), FORMATO_FECHA));
		filtro.setFechaHasta(Utiles.stringToDate(request.getParameter("fechaHasta"), FORMATO_FECHA));

		filtro.setIdPaisOrigen(Utiles.parseInteger(request.getParameter("idPaisOrigen")));
		filtro.setIdRegionOrigen(Utiles.parseInteger(request.getParameter("idRegionOrigen")));
		filtro.setIdPaisDestino(Utiles.parseInteger(request.getParameter("idPaisOrigen")));
		filtro.setIdRegionDestino(Utiles.parseInteger(request.getParameter("idRegionOrigen")));

		return filtro;
	}

}
